package com.shihan.redis.springboot.demo.utils;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import javax.annotation.Resources;
import java.util.concurrent.TimeUnit;

/**
 * TODO 对比一下 springboot-redis 项目，其注入 RedisTemplate 的方式与当前项目不同，需要好好理解一下。特别是关于序列化方式的问题（以及注入方式）。
 *
 * @Description 使用 RedisTemplate 提供的默认序列化方式，实现存储和取值时的序列化和反序列化
 * @Author shihan
 * @Date 2021/1/12 23:20
 * @Version 1.0
 */
@Component
public class RedisTemplateUtils {

    @Resource
    private RedisTemplate<String, Object> redisTemplate;

    /**
     * 使用 Redis 提供的默认序列化方式，存储 String 类型的数据，包括生命周期；
     *
     * @param key
     * @param value
     * @param expireTime
     */
    public void setObject(String key, Object value, Long expireTime) {
        redisTemplate.opsForValue().set(key, value);
        if (expireTime != null) {
            redisTemplate.expire(key, expireTime, TimeUnit.SECONDS);
        }
    }

    /**
     * 使用 Redis 提供的默认序列化方式，存储 String 类型的数据，永久存储；
     *
     * @param key
     * @param value
     */
    public void setObject(String key, Object value) {
        setObject(key, value, null);
    }

    /**
     * 使用 Redis 提供的默认反序列化方式，获取 String 类型对应的 Object 对象；
     *
     * @param key
     * @return
     */
    public Object getObject(String key) {
        return redisTemplate.opsForValue().get(key);
    }


}
